package com.showsu.editor.utils;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

/**
 * @Author: William
 * @Description: redis工具，封装的比较简单，后续可以依据业务需要去完善
 * @Date: Created in 1:31 下午 2024/8/16
 * @Modified By:
 */
@Component
public class RedisUtil {

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    // 设置键值对
    public void setValue(String key, String value) {
        redisTemplate.opsForValue().set(key, value);
    }

    // 设置键值对，并指定过期时间
    public void setValueWithExpire(String key, String value, long timeout, TimeUnit unit) {
        redisTemplate.opsForValue().set(key, value, timeout, unit);
    }

    // 获取键对应的值
    public String getValue(String key) {
        return redisTemplate.opsForValue().get(key);
    }

    // 删除指定的键
    public Boolean deleteKey(String key) {
        return redisTemplate.delete(key);
    }

    // 检查键是否存在
    public Boolean keyExists(String key) {
        return redisTemplate.hasKey(key);
    }

    // 设置键的过期时间
    public Boolean expireKey(String key, long timeout, TimeUnit unit) {
        return redisTemplate.expire(key, timeout, unit);
    }

    // 获取键的剩余过期时间（单位：秒）
    public Long getKeyExpire(String key) {
        return redisTemplate.getExpire(key, TimeUnit.SECONDS);
    }

    // 自增操作
    public Long increment(String key, long delta) {
        return redisTemplate.opsForValue().increment(key, delta);
    }

    // 自减操作
    public Long decrement(String key, long delta) {
        return redisTemplate.opsForValue().increment(key, -delta);
    }

    // 如果键不存在则设置值，返回是否设置成功
    public Boolean setValueIfAbsent(String key, String value) {
        return redisTemplate.opsForValue().setIfAbsent(key, value);
    }

    // 获取指定范围内的字符串
    public String getRange(String key, long start, long end) {
        return redisTemplate.opsForValue().get(key, start, end);
    }

    // 追加字符串到键上的已有值的末尾
    public Integer append(String key, String value) {
        return redisTemplate.opsForValue().append(key, value);
    }

    // 获取并设置指定键的值
    public String getAndSet(String key, String value) {
        return redisTemplate.opsForValue().getAndSet(key, value);
    }

    // 在列表头部插入值
    public Long leftPush(String key, String value) {
        return redisTemplate.opsForList().leftPush(key, value);
    }

    // 在列表尾部插入值
    public Long rightPush(String key, String value) {
        return redisTemplate.opsForList().rightPush(key, value);
    }

    // 获取列表范围内的值
    public java.util.List<String> getList(String key, long start, long end) {
        return redisTemplate.opsForList().range(key, start, end);
    }

    // 在集合中添加成员
    public Long addToSet(String key, String... values) {
        return redisTemplate.opsForSet().add(key, values);
    }

    // 获取集合中的所有成员
    public java.util.Set<String> getSet(String key) {
        return redisTemplate.opsForSet().members(key);
    }

    // 在有序集合中添加成员
    public Boolean addToZSet(String key, String value, double score) {
        return redisTemplate.opsForZSet().add(key, value, score);
    }

    // 获取有序集合中指定范围内的成员
    public java.util.Set<String> getRangeByScore(String key, double min, double max) {
        return redisTemplate.opsForZSet().rangeByScore(key, min, max);
    }

    // 删除有序集合中的成员
    public Long removeFromZSet(String key, String... values) {
        return redisTemplate.opsForZSet().remove(key, values);
    }
}
